home *** CD-ROM | disk | FTP | other *** search
- {
- HENRIK SCHMIDT-MOELLER
-
- I've made some procedures for EMS addressing in TP. EMS uses a technic called
- bank switching. It reserves a 64k area (EmmSeg) in memory for EMS and maps/
- unmaps 16k EMS-pages in this area. Look at interrupt 67h for a complete list of
- EMS commands. I haven't had time to comment on these procedures, so if you
- don't understand them, feel free to ask. OK, here goes nothing...
-
- Oh, by the way, REMEMBER to DEallocate!!!
- }
-
- VAR
- EmmSeg,
- EmmHandle : Word;
- Err : Byte;
-
- PROCEDURE DeallocateMem(Handle : Word); Forward;
-
- PROCEDURE Error(E : String);
- BEGIN
- DeallocateMem(Emmhandle);
- WriteLn(#7 + E);
- Halt(1);
- END;
-
- PROCEDURE AllocateMem(LogPages : Word);
- BEGIN
- ASM
- MOV AH, 43h
- MOV BX, LogPages
- INT 67h
- MOV Err, AH
- MOV EmmHandle, DX
- END;
- CASE Err OF
- $80 : Error('AllocateMem: Internal error in EMS software');
- $81 : Error('AllocateMem: Malfunction in EMS software');
- $84 : Error('AllocateMem: Undefined function');
- $85 : Error('AllocateMem: No more handles available');
- $87 : Error('AllocateMem: Allocation requested more pages than are' + #13#10 +
- ' physically available; no pages allocated');
- $88 : Error('AllocateMem: Specified more logical pages than are'+ #13#10 +
- ' currently available; no pages allocated');
- $89 : Error('AllocateMem: Zero pages requested');
- END;
- END;
-
- PROCEDURE MapEmm(PsyPage : Byte; LogPage : Word);
- BEGIN
- ASM
- MOV AH, 44h
- MOV AL, PsyPage
- MOV BX, LogPage
- MOV DX, EmmHandle
- INT 67h
- MOV Err, AH;
- END;
- CASE Err OF
- $80 : Error('MapEmm: Internal error in EMS software');
- $81 : Error('MapEmm: Malfunction in EMS software');
- $83 : Error('MapEmm: Invalid handle');
- $84 : Error('MapEmm: Undefined function');
- $8A : Error('MapEmm: Logical page not assigned to this handle');
- $8B : Error('MapEmm: Physical page number invalid');
- END;
- END;
-
- PROCEDURE DeallocateMem(Handle : Word);
- BEGIN
- ASM
- MOV AH, 45h
- MOV DX, Handle
- INT 67h
- END;
- END;
-
- PROCEDURE GetPageSeg;
- BEGIN
- ASM
- MOV AH, 41h
- INT 67h
- MOV EmmSeg, BX
- MOV Err, AH;
- END;
- CASE Err OF
- $80 : Error('GetPageSeg: Internal error in EMS software');
- $81 : Error('GetPageSeg: Malfunction in EMS software');
- $84 : Error('GetPageSeg: Undefined function');
- END;
- END;
-
- PROCEDURE GetMaxPages(VAR Num : Word);
- VAR
- Dummy : Word;
- BEGIN
- ASM
- MOV AH, 42h
- INT 67h
- MOV Dummy, BX
- MOV Err, AH;
- END;
- Num := Dummy;
- CASE Err OF
- $80 : Error('GetMaxPages: Internal error in EMS software');
- $81 : Error('GetMaxPages: Malfunction in EMS software');
- $84 : Error('GetMaxPages: Undefined function');
- END;
- END;
-
- PROCEDURE WriteMem(Page : Byte; Pos : Integer; Ch : Char);
- BEGIN
- Mem[EmmSeg : Page * $4000 + Pos] := Ord(Ch);
- END;
-
- PROCEDURE ReadMem(Page : Byte; Pos : Integer; VAR Ch : Char);
- BEGIN
- Ch := Chr(Mem[EmmSeg : Page * $4000 + Pos]);
- END;
-